package com.hboxs.asl.qcloudLVB.service;

import com.hboxs.asl.Page;
import com.hboxs.asl.Pageable;
import com.hboxs.asl.entity.Member;
import com.hboxs.asl.qcloudLVB.entity.Live;
import com.hboxs.asl.service.BaseService;
import org.json.JSONObject;

import java.util.List;
import java.util.Map;

/**
 * Service - 直播记录
 */
public interface LiveService extends BaseService<Live, Long> {

    /**
     * 禁播
     */
    Boolean forbidden(Long id);

    /**
     * 获取推流地址
     * 如果不传key和过期时间，将返回不含防盗链的url
     *
     * @param bizId    您在腾讯云分配到的bizid
     * @param streamId 您用来区别不通推流地址的唯一id(主播用户id)
     * @param key      推流防盗链KEY
     * @param txTime   过期时间 (QcloudDateUtils.getTxTime(1);)
     * @return 推流url
     */
    String getPushUrl(String bizId, String streamId, String key, Long txTime);

    /**
     * 获取直播url
     *
     * @param bizId    您在腾讯云分配到的bizid
     * @param streamId 主播用户id
     * @return 播放url
     */
    Map<String, String> getPlayUrl(String bizId, String streamId);

    /**
     * 修改状态
     * ----主播开始推流，并收到开始推流事件（PUSH_EVT_PUSH_BEGIN）时，调用此接口，
     * 将该流状态置为上线；主播停止推流后，调用此接口，将该流状态置为下线
     *
     * @param status 开关状态 0:关闭； 1:开启
     * @param liveId 直播id
     * @return 成功失败
     */
    Boolean changeStatus(int status, Long liveId);

    /**
     * 修改计数器
     *
     * @param anchor 主播
     * @param type   类型:(0:观看数量;1:点赞数量2:收藏数量)
     * @param optype (0:增加 1:减少)
     * @param flag   (0:直播 1:点播)
     * @param field  (点播的情况下使用，用于区分是哪个视频)
     */
    void changeCount(Member anchor, Member user, int type, int optype, int flag, String field);

    /**
     * 主播关闭直播，清空正在观看直播的用户
     * @param live
     */
    void clearWatchingMembers(Live live);

    /**
     * 创建直播
     *
     * @param live   直播
     * @param anchor 主播
     * @param connectLive 连麦直播id
     * @return live
     */
    Live create(Live live, Member anchor, Live connectLive);

    /**
     * 用直播状态查询分页信息
     *
     * @param pageable   分页信息
     * @param liveStatus 直播专状态
     * @return page
     */
    Page<Live> findPage(Pageable pageable, Live.LiveStatus liveStatus, Live.Type type);

    /**
     * 获取COS文件上传的签名
     *
     * @param cosPath    需要签名的路径
     * @param bucketName 要操作的bucket
     */
    String getCOSSign(String bucketName, String cosPath);

    /**
     * 根据主播和状态查找直播
     *
     * @param anchor 主播
     * @param status 直播状态
     * @return 直播
     */
    Live findByAnchorAndStatus(Member anchor, Live.LiveStatus status);

    /**
     * 断线直播清除定时器
     */
    void evictDeadStream();

    /**
     * 断线直播清除定时器
     */
    void evictDeadStream2();

    /**
     * 查询直播状态
     *
     * @param liveId 直播id
     * @return status 状态 int 0:断流；1:开启；3:关闭;
     * recv_type 播放协议 int 1:rtmp/flv；2:hls；3:rtmp/flv+hls
     * rate_type 码率 int 0:原始码率；10:普清；20:高清
     */
    JSONObject getStatus(Long liveId);

    /**
     * 查找主播创建或者直播中的直播，修改为下线
     *
     * @param anchor 主播
     */
    void offLive(Member anchor);

    /**
     * 修改直播状态为直播中
     *
     * @param anchor 主播
     */
    void onLive(Member anchor);

    /**
     * 断开连麦
     */
    void disConnect(Live live);

    List<Live> findConnectLive(Long connectLiveId);

    List<Live> findConnectLive(Long connectLiveId, Live.LiveStatus liveStatus);

    /**
     * 获取主播直播的视频总数
     * @param type
     * @return
     */
    long getHostLiveCounts(Live.Type type);
}
